#ifndef GDL_INPUT_HPP
# define GDL_INPUT_HPP

# include "Window.hpp"

namespace gdl
{
	////////////////////////////////////////////////////////////
	/// Forward declaration of InputImpl.
	////////////////////////////////////////////////////////////
	class	InputImpl;

	namespace Keys
	{
		////////////////////////////////////////////////////////////
		/// Enum of keys.
		////////////////////////////////////////////////////////////
		enum	Key
		{
			A, B, C, D, E, F, G, H, I, J, K, L, M,
			N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
			Num0, Num1, Num2, Num3, Num4,
			Num5, Num6, Num7, Num8, Num9,
			Escape, LControl, LShift, LAlt, LSystem,
			RControl, RShift, RAlt, RSystem, Menu,
			LBracket, RBracket, SemiColon, Comma,
			Period, Quote, Slash, BackSlash, Tilde,
			Equal, Dash, Space, Return, Back, Tab,
			PageUp, PageDown, End, Home, Insert,
			Delete, Add, Subtract, Multiply,
			Divide, Left, Right, Up, Down,
			Numpad0, Numpad1, Numpad2, Numpad3, Numpad4,
			Numpad5, Numpad6, Numpad7, Numpad8, Numpad9,
			F1, F2, F3, F4, F5, F6, F7, F8, F9,
			F10, F11, F12, F13, F14, F15,
			Pause, Count
		};
	}

	namespace	Mouse
	{
		////////////////////////////////////////////////////////////
		/// Enum of mouse's buttons
		////////////////////////////////////////////////////////////
		enum	Button
		{
			Left, Right, Middle
		};
	}

	////////////////////////////////////////////////////////////
	/// The Input class catches each input event for a window.
	////////////////////////////////////////////////////////////
	class		Input
	{
	public:
		////////////////////////////////////////////////////////////
		/// Constructor.
		///
		/// \param[in] window Window to link with.
		////////////////////////////////////////////////////////////
		Input(gdl::Window & window);

		////////////////////////////////////////////////////////////
		/// Default destructor.
		////////////////////////////////////////////////////////////
		~Input();

		////////////////////////////////////////////////////////////
		/// Check if a key is down.
		///
		/// \param[in] key Key to check.
		/// \return If the key is down, true is returned.
		/// Otherwise, returned false.
		////////////////////////////////////////////////////////////
		bool		isKeyDown(gdl::Keys::Key key);
		////////////////////////////////////////////////////////////
		/// Check if a mouse button is down.
		///
		/// \param[in] button Button to check.
		/// \return If the button is down, true is returned.
		/// Otherwise, returned false.
		////////////////////////////////////////////////////////////
		bool		isMouseButtonDown(gdl::Mouse::Button button);
		////////////////////////////////////////////////////////////
		/// Get the cursor position.
		///
		/// \return The cursor position on x-axis.
		////////////////////////////////////////////////////////////
		int			getMousePositionX(void) const;
		////////////////////////////////////////////////////////////
		/// Get the cursor position.
		///
		/// \return The cursor position on y-axis.
		////////////////////////////////////////////////////////////
		int			getMousePositionY(void) const;
	private:

		////////////////////////////////////////////////////////////
		/// Link this class with the window's inputs.
		/// Is called in the constructor.
		////////////////////////////////////////////////////////////
		void		getInput(void);

		////////////////////////////////////////////////////////////
		/// Input implementation.
		////////////////////////////////////////////////////////////
		InputImpl&		input_;
	};
}

#endif
